StupidBeauty
Read times:1586Posted at: - no title specified

Qt5教程翻译: Qt5: 新的信号和信号槽语法,Qt5: New signal and slot syntax

不用担心,妳的旧代码 (Qt 4.x) 仍然会正常运行,QT砖家们仍然会继续支持旧的、基于字符串的信号连接。那么 ,新的信号/信号槽语法有什么不同呢?简单 来说,妳可以使用下面示例 中的形式来连接信号和信号槽。注意 ,妳仍然需要在类中定义Q_OBJECT 这个宏,因为信号和信号槽是由它来引入的。

1

connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue );

除了使用SIGNAL()SLOT()两个宏以外,现在,妳还可以使用C++函数指针来连接信号和信号槽。在Qt5中,妳可以将信号连接到某个类的任意成员函数,也就是说,它们不需要是信号槽。注意,最终,Qt的信号槽将仅仅是类的成员函数。“slots”关键词只是一个空的宏定义,只会在元对象编译器(MOC (Meta Object Compiler))解析头文件时会被用到。

让我们用几个例子来说明新的语法是什么样的。妳可能已经有了下面这样的一个类:

class MyClass : public QObject

{

    Q_OBJECT

public:

explicit MyClass(QWidget *parent = 0);

void myMethod(QVariant x);

signals:

void mySignal1(int x);

void mySignal2(QString x);

public slots:

void buttonClicked();

void mySlot(int x);

};

// 标准的非成员函数

static void myFunction()

{

    qDebug() << "My Function called";

}

现在,如果妳想将信号连接到信号槽或者类的成员函数的话,妳可以这样写:

// this指针是MyClass的一个实例

connect(this, &MyClass::mySignal1, this, &MyClass::mySlot1);

// 连接到类的成员函数,并且进行隐式的类型转换,将QString 转换为QVariant

connect(this, &MyClass::mySignal2, this, &MyClass::myMethod);

// 将mySignal()信号连接到非信号槽的函数myFunction()

connect(this, &MyClass:mySignal, &myFunction);

个人认为,新的语法使得信号/信号槽的连接更加灵活。除此之外,甚至还可以利用新的C++11标准中的特性(tr1::bind和lambda),以将信号连接到某些特殊的东西上,例如匿名(lambda)函数。

强类型的枚举

C++11 中引入了 强类型的枚举 C++03 的枚举不同,强类型的枚举是类型安全的。 C++03 中,妳可以定义一个枚举,然后将它与一个整数比较,或者与另一个枚举“类型”比较,这是符合标准的。 强类型的枚举呢,不再具有这个问题,因为,它们不再会被隐式转换成整数。 C++11中, 可使用以下语法来定义一个强类型的枚举:

1

enum class MyEnumeration{

2

Value1,

3

Value2,

4

Value3

5

};

使用强类型的枚举,会使得代码更安全,尤其是,当那些枚举变量被用于信号和信号槽的参数时特别有用。这个特性,与新的信号/信号槽语法组合起来,可以帮助妳写出更好的代码。

新语法的优点和缺点

原有 的基于字符串的语法,已经狠好了,它是 Qt 的关键特性之一,但它并不完美。 我相邻,每个人用过 Qt 的人, 都曾经在建立信号/信号槽连接时失败过,但是 妳却无法在编译时发现这一点。如果连接失败 ,则,妳会在运行程序时看到一个警告。如果使用 新的信号/信号槽连接语法,那么,妳将会在编译时发现连接错误。

使用新的语法,更容易避免出错。例如,妳现在不需要提供一串信号或信号槽参数类型的列表了,只需要提供函数指针。我认为,这绝对是一个优点,如下所示。

connect(this, &MyClass::mySignal, this, &MyClass::mySlot);

对比

    connect(this, SIGNAL(mySignal(int)), this, SLOT(mySlot(int)));

在Qt 5 中,断开信号连接变得更复杂了。 看一下 原始文章 中的例子 ,简单 来说,妳需要维护一个连接信息( QObject ::Connection)列表,针对 妳想断开的每个连接,调用 QObject::disconnect( ..) 。自然 ,如果妳是使用旧的方法来连接的,那么也可以使用旧的方法来断开连接。

新语法的最大优点之一,就是,可以将信号直接连接到类的成员函数或其它的非成员函数,而它们都不需要显式定义为信号槽。

未知美人

陈思思

Your opinions

Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands

 
Recent comments
2017年4月~2019年4月垃圾短信排行榜Posted at:Thu Sep 26 04:51:48 2024
Qt5.7文档翻译:QWebEngineCookieStore类,QWebEngineCookieStore ClassPosted at:Fri Aug 11 06:50:35 2023盲盒kill -9 18289 Grebe.20230517.211749.552.mp4